package org.dtrd.modules.shop.service.impl;

import com.github.xiaoymin.knife4j.core.util.StrUtil;
import org.dtrd.modules.doctor.entity.po.DtrdEntRdDoctor;
import org.dtrd.modules.doctor.service.IDtrdEntRdDoctorService;
import org.dtrd.modules.doctor.service.IDtrdRlDoctorTeamDoctorService;
import org.dtrd.modules.doctor.service.impl.DtrdEntRdDoctorServiceImpl;
import org.dtrd.modules.shop.entity.po.DtrdEntRdPayRefundFlow;
import org.dtrd.modules.shop.mapper.DtrdEntRdPayRefundFlowMapper;
import org.dtrd.modules.shop.service.IDtrdEntRdPayRefundFlowService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.dtrd.modules.shop.entity.bean.PayRefundFlowDetail;
import org.dtrd.modules.shop.entity.bean.PayRefundFlowListInfo;
import org.dtrd.modules.shop.entity.bean.PayRefundFlowListRequest;
import org.dtrd.modules.shop.entity.bean.PayRefundFlowPageRequest;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;


/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xiao
 * @since 2022-06-23
 */
@DS("multi-datasource1")
@Service
public class DtrdEntRdPayRefundFlowServiceImpl extends ServiceImpl<DtrdEntRdPayRefundFlowMapper, DtrdEntRdPayRefundFlow> implements IDtrdEntRdPayRefundFlowService {

    @Autowired
    private IDtrdEntRdDoctorService doctorService;

    @Override
    public List<PayRefundFlowListInfo> getPayRefundFlowList(PayRefundFlowListRequest request) {
        LambdaQueryWrapper<DtrdEntRdPayRefundFlow> queryWrapper = baseQueryWrapper();
        List<DtrdEntRdPayRefundFlow> poList = list(queryWrapper);
        List<PayRefundFlowListInfo> dtoList = new ArrayList<>(poList.size());
        if (!poList.isEmpty()) {
            dtoList = poList.stream().map(PayRefundFlowListInfo::new).collect(Collectors.toList());
        }
        return dtoList;
    }

    @Override
    public IPage<PayRefundFlowListInfo> pagePayRefundFlow(PayRefundFlowPageRequest request) {
        LambdaQueryWrapper<DtrdEntRdPayRefundFlow> queryWrapper = baseQueryWrapper();
        IPage<DtrdEntRdPayRefundFlow> page = new Page<>(request.getPageNum(), request.getPageSize());
        if (request.getFlowType() != null) {
            queryWrapper.eq(DtrdEntRdPayRefundFlow::getFlowType, request.getFlowType());
        }
        if (request.getDoctorId() != null) {
            queryWrapper.eq(DtrdEntRdPayRefundFlow::getFlowDoctorId, request.getDoctorId());
        }
        if (StrUtil.isNotBlank(request.getOrgCode())) {
            queryWrapper.eq(DtrdEntRdPayRefundFlow::getOrgCode, request.getOrgCode());
        }
        if (StrUtil.isNotBlank(request.getMonth())) {
            queryWrapper.eq(DtrdEntRdPayRefundFlow::getFlowCreateMonth, request.getMonth());
        }
        page = this.page(page, queryWrapper);
//        return page.convert(PayRefundFlowListInfo::new);
        return page.convert(po -> {
            PayRefundFlowListInfo payRefundFlowListInfo = new PayRefundFlowListInfo(po);
            if (po.getFlowDoctorId() != null) {
                DtrdEntRdDoctor doctor = doctorService.getById(po.getFlowDoctorId());
                String doctorName = doctor != null ? doctor.getDoctorsName() : null;
                payRefundFlowListInfo.setCreateDoctorName(doctorName);
            }
            return payRefundFlowListInfo;
        });
    }

    @Override
    public PayRefundFlowDetail getPayRefundFlow(Integer dataId) {
        DtrdEntRdPayRefundFlow dtrdEntRdPayRefundFlow = getById(dataId);
        return Optional.ofNullable(dtrdEntRdPayRefundFlow)
                        .map(po -> new PayRefundFlowDetail().parseFromPo(po))
                        .orElse(null);
    }

    @Override
    public boolean saveOrUpdatePayRefundFlow(PayRefundFlowDetail dto) {
        DtrdEntRdPayRefundFlow dtrdEntRdPayRefundFlow = new DtrdEntRdPayRefundFlow();
        if(dto.getDataId() == null){
            dtrdEntRdPayRefundFlow = dtrdEntRdPayRefundFlow.init();
        }
        dtrdEntRdPayRefundFlow.parseFromDto(dto);
        return saveOrUpdate(dtrdEntRdPayRefundFlow);
    }

    @Override
    public boolean removePayRefundFlow(Integer dataId) {
        return removeById(dataId);
    }

    private LambdaQueryWrapper<DtrdEntRdPayRefundFlow> baseQueryWrapper() {
        return Wrappers.lambdaQuery(DtrdEntRdPayRefundFlow.class)
                        .eq(DtrdEntRdPayRefundFlow::getIsDel, 0);
    }

    private LambdaUpdateWrapper<DtrdEntRdPayRefundFlow> baseUpdateWrapper() {
        return Wrappers.lambdaUpdate(DtrdEntRdPayRefundFlow.class)
                        .eq(DtrdEntRdPayRefundFlow::getIsDel, 0);
    }
}
